<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of VtaCondicionalStrategy
 *
 * @author maxi
 */
class VtaCondicionalStrategy implements VentasStrategy {

    /**
     * Realiza el proceso de guardado de una venta condicional y la actualizacion de las otras entidades
     * @param Clientes $cliente
     * @param tipo de Venta $tipoVta
     * @param int $idVenta
     * @param array $tiposPago
     * @return bool; true si todo fue correcto, false en caso contrario
     */
    public function checkOut($cliente, $tipoVta, $idVenta=null, $tiposPago=null) {

        $con = Propel::getConnection();

        try {
            //abrimos la transacción
            $con->beginTransaction();

            //operaciones pertinentes contra la base de datos

            $vm = VentasManager::getInstance();
            $iva = $vm->getIva() / 100;
            $carro = sfContext::getInstance()->getUser()->getAttribute('venta');

            //Si la venta tiene productos
            if (!empty($carro)) {

                //Obtener Total
                //$total = $vm->getPrecioFinal();
                $total = $vm->getPrecioVentaSinDescuento();

                //Se trata de una edicion actualiza detalle de venta y datos de la venta
                if (!empty($idVenta)) {
                    $venta = VentasPeer::existe($idVenta);
                    //existe en BD?
                    if ($venta) {
                        $venta = VentasPeer::retrieveByPK($idVenta);

                        if (!empty($venta)) {
                            //Borrar detalle venta
                            $detalle = DetalleVentasPeer::BorrarDetalleDeVenta($idVenta);

                            if ($detalle) {
                                //actualizar valores
                                $tipVta = $venta->getVtaTipo();
                                if ($tipoVta != $tipVta) {
                                    $nroFactura = $vm->autogenerarNroFactura($tipoVta);
                                    $venta->setVtaNroFactura($nroFactura);
                                    $venta->setVtaTipo($tipoVta);
                                }

                                $venta->setVtaCliente($cliente);
                                $venta->setVtaTotal($total);
                                //$venta->setVtaFecha($fecha);
                                $venta->setVtaUsuario(sfContext::getInstance()->getUser()->getGuardUser()->getId());
                                $venta->save();
                            }
                        }
                    }

                    //Crea una nueva venta
                } else {
                    $iva = $vm->getIva();
                    $userId = sfContext::getInstance()->getUser()->getGuardUser()->getId();
                    $nroFactura = $vm->autogenerarNroFactura($tipoVta);
                    $descuento = $vm->getDescuento();
                    $tiposPago = $vm->getFormasDePago();

                    //Guardar Venta
                    $venta = new Ventas();
                    $ventaGuardada = $venta->almacenarVenta($nroFactura, $cliente, $total, $tipoVta, $userId, $iva, $descuento, $tiposPago);
                }

                //Si guarda la venta
                if ($ventaGuardada) {

                    //Guarda los detalles de la venta y actualiza el stock
                    foreach ($carro["productos"] as $producto) {

                        $prod = $producto["producto"];
                        $cant = $producto["cantidad"];

                        $articulo = $prod->getProArticulo();
                        $precio = $prod->getProPrecio();
                        $talle = $prod->getProTalle();
                        $ganancia = $prod->getProGanancia();
                        $idVenta = $venta->getVtaId();
                        //Guardar Detalle
                        $detalle = new DetalleVentas();
                        $detalle->almacenarDetalleVenta($articulo, $cant, $precio, $talle, $ganancia, $idVenta);

                        $tipoIng = sfConfig::get('app_caja_operacion_ingreso');
                        $producto = ProductosPeer::retrieveByPK($prod->getProArticulo(), $prod->getProTalle());
                        if (!empty($producto)) {
                            $producto->actualizarStock($cant, $tipoIng, true);
                        }
                    }
                }
            }
            //si todo va bien guardamos los cambios
            $con->commit();
            return true;
        } catch (Exception $e) {
            // Hacemos rollback de los cambios en caso de fallo
            $con->rollBack();
            return false;
        }
    }

}

?>
